package game.engine.base

import android.graphics.*
import game.engine.base.anim.TweenManager
import game.engine.base.input.InputManager

// 每个Scene当作一个独立的管理
//
abstract class Scene(val name:String = "") : Node() {

    companion object{
        // for debug
        val fpsPaint = Paint().apply {
            color = Color.WHITE
            textSize = 20f
        }
    }

    var fillBgBitmap:Bitmap? = null
    val fillRectF = RectF()

    // 任务管理
    val scheduler = Scheduler(this)

    // 动画管理
    val tweenManager = TweenManager(this)

    // Input事件管理
    val inputMgr = InputManager(this)

    open fun onEnter(){
        val director = Director.instance
        finalMatrix.set(director.screenMatrix)
        val wa = director.windowAdapter
        fillRectF.set(wa.minX,wa.minY,wa.maxX,wa.maxY)
    }

    fun frameUpdate(dt:Float,canvas: Canvas){
        inputMgr.update()
        tweenManager.update(dt)
        scheduler.update(dt)

        update(dt)

        // 删除场景树中所有 willDestroy 的节点
        // TODO: 可以优化成 只通过一次遍历 边删除 边渲染
        if (!willDestroy){
            removeDiedChildren()
            render(canvas)
        }else{
            onRelease()
        }
    }

    private fun render(canvas:Canvas){

        // 填满屏幕的bitmap
        if (fillBgBitmap != null){
            canvas.setMatrix(finalMatrix)
            canvas.drawBitmap(fillBgBitmap!!,null,fillRectF,null)
        }

        // 渲染的时候,要求:
        // 1. 已经排好序
        // 2. worldMatrix更新好
        children?.sort()
        children?.forEach { child->
            child.draw(canvas,finalMatrix)
        }

        // 是否显示FPS
        if (CoreDebug.FpsDebug){
            canvas.setMatrix(finalMatrix)
            val wa = Director.instance.windowAdapter
            canvas.drawText("fps:${Fps.fps}",wa.minX + 5f,wa.maxY - 10f,fpsPaint)
        }
    }

    //------------------------------------------
    // 子类需要实现的方法
    abstract fun onTouch(touch: Touch)
    open fun update(dt:Float){}

    open fun onExit(){
        if (CoreDebug.SceneDebug){
            CoreDebug.info("scene:${name} onExit called!")
        }
        // 所有的子节点 全部标记为 willDestroy
        removeFromParent()
    }

    override fun onRelease() {
        // 释放各种资源
        inputMgr.release()
        scheduler.release()
        tweenManager.release()
    }

    fun scheduleOnce(delay:Float,action:(Int)->Unit){
        scheduler.addFrameFunc(FrameFunc(delay,1,0f,action))
    }

    fun scheduleCount(delay: Float,count:Int,duration:Float,action:(Int)->Unit){
        scheduler.addFrameFunc(FrameFunc(delay,count,duration,action))
    }
}